#pragma once 
#include"../log_all_files/log.h"



/*基于单位时间段滚动生成的日志落地文件*/


//额外：

// 用户拓展日志落地模块：

enum class Timegap
{

  GAP_SECOND,
  GAP_MINUTE,
  GAP_HOUR,
  GAP_DAY

};
class Rollbytimesink : public Logsink
{

public:
  Rollbytimesink(std::string name, Timegap gap) : _basename(name)
  { // 初始化对应的_gap_time
    switch (gap)
    {

    case Timegap::GAP_SECOND:
      _gap_time = 1;
      break;
    case Timegap::GAP_MINUTE:
      _gap_time = 60;
      break;
    case Timegap::GAP_HOUR:
      _gap_time = 3600;
      break;
    case Timegap::GAP_DAY:
      _gap_time = 3600 * 24;
      break;
    }
    // 获取当前是第几个时间段
    // 需要特判如果是秒的时候：
    _cur_gap = _gap_time == 1 ? Date::Now() : Date::Now() % _gap_time;
    //  不存在进行目录创建：
    if (!File::Isexit(_basename))
    {
      File::Createdir(File::Getpath(_basename));
    }
    _ofs.open(Createfilename(), std::ios::app | std::ios::binary);
    if (!_ofs.good())
    {
      std::cout << "日志文件打开失败\n";
      assert(_ofs.is_open());
    }
  }

  std::string &Getfilename()
  {
    return _basename;
  }
  void log(const char *data, size_t len) override
  {
    // 每次写的时候进行当前时间段是否超时的判断：
    time_t cur = Date::Now();
    if ((_gap_time == 1 ? cur : cur % _gap_time) != _cur_gap)
    {
      // 超出当前时间段了。重新建立文件：

      _ofs.close(); // 一定不要忘记关闭之前_ofs管理的文件
      _ofs.open(Createfilename(), std::ios::app | std::ios::binary);
      if (!_ofs.good())
      {
        std::cout << "日志文件打开失败\n";

        assert(_ofs.is_open());
      }
      
    }
    _ofs.write(data, len);
    if (!_ofs.good())
    {
      std::cout << "日志输出失败\n";
    }
  }

  std::string Createfilename()
  {
    time_t t = time(NULL);
    struct tm lt;
    localtime_r(&t, &lt);
    std::stringstream ss;
    ss << _basename;
    ss << lt.tm_year + 1900;
    ss << lt.tm_mon + 1;
    ss << lt.tm_mday;
    ss << lt.tm_hour;
    ss << lt.tm_min;
    ss << lt.tm_sec;
    ss << ".log";
    return ss.str();
  }

private:
  std::string _basename;
  std::ofstream _ofs;
  size_t _gap_time; // 一个时间段多长时间
  size_t _cur_gap;  // 当前属于第几个时间段
};
